import axios from 'axios'
import config from '../config/index.js'
// 引入element组件的消息提示框
import { ElMessage } from 'element-plus'

const NETWORK_ERROR = '网络请求异常，请稍后重试'
// 封裝一個axios实例对象
const service = axios.create({
  baseURL: config.baseApi
})

// 请求之前
service.interceptors.request.use(req => {
  // 在这里定义header
  return req
})

// 在请求之后做一些事情
service.interceptors.response.use(res => {
  const { code, data, msg } = res.data
  if (code == 200) {
    return data
  } else {
    // 网络请求错误
    ElMessage.error(msg || NETWORK_ERROR)

    // 注意这里也要返回一个Promise
    return Promise.reject(msg || NETWORK_ERROR)
  }
})

// {
//   method:'get',
//   params:{

//   },
//   mock:false
// }

/**封装核心函数 */
function request(options) {
  options.method = options.method || 'get'

  // 让所有类型的axios请求携带的参数都放在data中
  // 当请求为get时，让data里的数据放在params中
  if (options.method.toLowerCase() == 'get') {
    options.params = options.data
  }

  // 对mock的处理
  let isMock = config.mock // 这一步是调用mock的总开关
  if (typeof options.mock !== 'undefined') {
    // 这一步是获取当axios请求的mock开关，优先级高于总开关
    isMock = options.mock
  }

  // 对线上环境做处理
  if (config.env == 'prod') {
    // 当是线上环境，要确保基地址一定不是mock
    service.defaults.baseURL = config.baseApi
  } else {
    // 当是其他环境
    service.defaults.baseURL = isMock ? config.mockApi : config.baseApi
  }

  return service(options)
}

export default request